package com.huangge1199.codewars;

/**
 * @ClassName PureHand
 * @Description TODO
 * @Author huangge1199
 * @Date 2021/10/9 12:01
 **/
public class PureHand {
    static boolean bl = false;

    public static String solution(String tiles) {
        int[] arrs = new int[10];
        for (char ch : tiles.toCharArray()) {
            arrs[ch - '0']++;
        }
        String str = "";
        // 只有1~9的数字满足添加条件，由于按照升序输出，这里的循环也是依次递加
        for (int i = 1; i < 10; i++) {
            if (arrs[i] == 4) {
                continue;
            }
            arrs[i]++;
            // 先找到2个一样的牌，并将其排除在外
            for (int j = 1; j < 10; j++) {
                if (arrs[j] >= 2) {
                    arrs[j] -= 2;
                    bl = false;
                    dfs(arrs, 1);
                    arrs[j] += 2;
                    if (bl) {
                        str += i;
                        break;
                    }
                }
            }
            arrs[i]--;
        }
        return str;
    }

    /**
     * 加入一张牌后是否满足赢的条件
     * @param arrs 去除1对2个相同的牌之后的全部数字编号
     * @param index 当前牌的编号
     */
    private static void dfs(int[] arrs, int index) {
        // 全部编号都走通的时候，说明可以赢
        if (index == arrs.length) {
            bl = true;
            return;
        }
        if (arrs[index] == 0) {
            dfs(arrs, index + 1);
        } else {
            // 牌的个数大于等于3时，可以组合成3个一样的牌
            if (arrs[index] >= 3) {
                arrs[index] -= 3;
                // arrs[index] > 0 ? index : index + 1 判断当前编号的牌是否消耗完
                dfs(arrs, arrs[index] > 0 ? index : index + 1);
                arrs[index] += 3;
                if (bl) {
                    return;
                }
            }

            // 要组合成成3张连续的牌
            // 那么就得保证该张牌的编号小于等于7
            if (index > 7 || arrs[index + 1] < 1 || arrs[index + 2] < 1) {
                bl = false;
                return;
            }
            arrs[index]--;
            arrs[index + 1]--;
            arrs[index + 2]--;
            dfs(arrs, arrs[index] > 0 ? index : index + 1);
            arrs[index]++;
            arrs[index + 1]++;
            arrs[index + 2]++;
        }
    }
}
